﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Yun.Interface;
using Yun.Response;
using Yun.Util;

namespace Yun.IM.Request
{
    /// <summary>
    /// 阿里云推送信息
    /// yun.im.aliyun.push.send
    /// </summary>
    public class AliyunPushRequest : ITopRequest<IntResultResponse>
    {
        /// <summary>
        /// 推送用户ID，多个用户用英文逗号隔开
        /// </summary>
        public string UserId { get; set; }

        /// <summary>
        /// AppKey信息
        /// </summary>
        public long? AliyunAppKey { get; set; }

        /// <summary>
        /// 推送目标：
        ///DEVICE:根据设备推送
        ///ACCOUNT:根据账号推送
        ///ALIAS:根据别名推送
        ///TAG:根据标签推送
        ///ALL:推送给全部设备
        /// </summary>
        public string Target { get; set; } = "DEVICE";

        /// <summary>
        /// 根据Target来设定，多个值使用逗号分隔，最多支持100个，超过100分多次推送。
        ///Target=DEVICE，值如deviceid111,deviceid1111
        ///Target = ACCOUNT，值如account111,account222
        ///Target = ALIAS，值如alias111,alias222
        ///Target = TAG，支持单Tag和多Tag，格式请参考 标签格式
        ///Target=ALL，值为all
        /// </summary>
        public string TargetValue { get; set; }

        /// <summary>
        /// MESSAGE：表示消息，默认值
        /// NOTICE：表示通知
        /// </summary>
        public string PushType { get; set; }

        /// <summary>
        /// 设备类型，取值范围为：
        ///IOS：IOS设备
        ///ANDROID：Andriod设备
        ///ALL：全部类型设备
        /// </summary>
        public string DeviceType { get; set; }

        /// <summary>
        /// Android推送时通知/消息的标题以及IOS消息的标题（必填），
        /// IOS 10+通知显示标题，[ IOS 8.2 小于等于 IOS系统 小于 IOS 10 ]替换通知应用名称（选填）
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// Android推送时通知的内容/消息的内容；IOS消息/通知内容，推送的内容大小是有限制的
        /// </summary>
        public string Body { get; set; }

        /// <summary>
        /// 用于定时发送。不设置缺省是立即发送。时间格式按照ISO8601标准表示，并需要使用UTC时间，格式为YYYY-MM-DDThh:mm:ssZ
        /// </summary>
        public string PushTime { get; set; }

        /// <summary>
        /// 离线消息/通知的过期时间，和StoreOffline配合使用，过期则不会再被发送，最长保存72小时。默认为72小时。时间格式按照ISO8601标准表示，并需要使用UTC时间，格式为YYYY-MM-DDThh:mm:ssZ，过期时间不能小于当前时间或者定时发送时间加上3秒（ExpireTime > PushTime + 3秒），3秒是为了冗余网络和系统延迟造成的误差。
        /// </summary>
        public string ExpireTime { get; set; }

        /// <summary>
        /// 离线消息/通知是否保存。若保存，在推送时候用户不在线，在过期时间（ExpireTime）内用户上线时会被再次发送。StoreOffline默认设置为false，ExpireTime默认为72小时。（IOS通知走Apns链路，不受StoreOffline影响）
        /// </summary>
        public bool? StoreOffline { get; set; }

        public string BatchNumber { get; set; }

        /// <summary>
        /// 通知的提醒方式
        ///VIBRATE：振动 默认值
        ///SOUND：声音
        ///BOTH：声音和振动
        ///NONE：静音
        /// </summary>
        public string AndroidNotifyType { get; set; }

        /// <summary>
        /// 点击通知后动作
        ///APPLICATION：打开应用 默认值
        ///ACTIVITY：打开应用AndroidActivity
        ///URL：打开URL
        ///NONE：无跳转
        /// </summary>
        public string AndroidOpenType { get; set; }

        /// <summary>
        /// 设定通知打开的activity，仅当AndroidOpenType="Activity"有效，如：com.alibaba.cloudpushdemo.bizactivity
        /// </summary>
        public string AndroidActivity { get; set; }

        /// <summary>
        /// Android收到推送后打开对应的url,仅当AndroidOpenType="URL"有效
        /// </summary>
        public string AndroidOpenUrl { get; set; }

        /// <summary>
        /// 设置该参数后启动小米托管弹窗功能, 此处指定通知点击后跳转的Activity（托管弹窗的前提条件：1. 集成小米辅助通道；2. StoreOffline参数设为true）注意:小米辅助通道对托管弹窗传输有长度限制,title16字符(中英文都以一个字符计算)，Body小于128字符(中英文都以一个字符计算)。
        /// </summary>
        public string AndroidXiaoMiActivity { get; set; }

        /// <summary>
        /// 小米托管弹窗模式下Title内容,长度限制:小于16字符（中英文都以一个字符计算）。
        /// </summary>
        public string AndroidXiaoMiNotifyTitle { get; set; }

        /// <summary>
        /// 小米托管弹窗模式下Body内容,长度限制:小于128字符（中英文都以一个字符计算）。
        /// </summary>
        public string AndroidXiaoMiNotifyBody { get; set; }

        /// <summary>
        /// Android通知声音（保留参数，当前暂不起作用）
        /// </summary>
        public string AndroidMusic { get; set; }

        /// <summary>
        /// Android自定义通知栏样式，取值：1-100
        /// </summary>
        public int? AndroidNotificationBarType { get; set; }

        /// <summary>
        /// Android通知在通知栏展示时排列位置的优先级 -2 -1 0 1 2
        /// </summary>
        public int? AndroidNotificationBarPriority { get; set; }

        /// <summary>
        /// 设定通知的扩展属性。(注意 : 该参数要以 json map 的格式传入,否则会解析出错)
        /// </summary>
        public string AndroidExtParameters { get; set; }

        /// <summary>
        /// IOS的通知是通过APNs中心来发送的，需要填写对应的环境信息。
        /// DEV：表示开发环境
        /// PRODUCT：表示生产环境
        /// </summary>
        public string IOSApnsEnv { get; set; }

        /// <summary>
        /// 消息推送时设备不在线（既与移动推送的服务端的长连接通道不通），则这条推送会做为通知，通过苹果的APNs通道送达一次。注意：离线消息转通知仅适用于生产环境
        /// </summary>
        public bool? IOSRemind { get; set; }

        /// <summary>
        /// IOS消息转通知时使用的IOS通知内容，仅当IOSApnsEnv=PRODUCT && IOSRemind为true时有效
        /// </summary>
        public string IOSRemindBody { get; set; }

        /// <summary>
        /// IOS通知声音，指定存放在app bundle或沙盒Library/Sounds目录下的音频文件名，参考：IOS推送如何设定通知声音，（若指定为空串（””），通知为静音；若不设置，默认填充default为系统提示音）
        /// </summary>
        public string IOSMusic { get; set; }

        /// <summary>
        /// IOS应用图标右上角角标
        /// </summary>
        public int? IOSBadge { get; set; }

        /// <summary>
        /// 开启IOS静默通知
        /// </summary>
        public bool? IOSSilentNotification { get; set; }

        /// <summary>
        /// IOS通知副标题内容（IOS 10+）
        /// </summary>
        public string IOSSubtitle { get; set; }

        /// <summary>
        /// 指定IOS通知Category（IOS 10+）
        /// </summary>
        public string IOSNotificationCategory { get; set; }

        /// <summary>
        /// 是否使能IOS通知扩展处理（IOS 10+）
        /// </summary>
        public bool? IOSMutableContent { get; set; }

        /// <summary>
        /// IOS通知的扩展属性,IOS 10+ 可以在此指定富媒体推送通知的资源Url: {“attachment”: “https://xxxx.xxx/notification_pic.png"} (注意 : 该参数要以json map的格式传入,否则会解析出错)
        /// </summary>
        public string IOSExtParameters { get; set; }


        public void Validate()
        {
            RequestValidator.ValidateRequired("aliyunappkey", AliyunAppKey); 
            RequestValidator.ValidateRequired("pushtype", PushType);
            RequestValidator.ValidateRequired("devicetype", DeviceType);
            RequestValidator.ValidateRequired("body", Body);
        }

        public string GetApiName()
        {
            return "yun.im.aliyun.push.send";
        }

        public IDictionary<string, string> GetParameters()
        {
            var parameters = new YunDictionary
            {
                {"userid", UserId},
                {"aliyunappkey", AliyunAppKey},
                {"target", Target},
                {"targetvalue", TargetValue},
                {"pushtype", PushType},
                {"devicetype", DeviceType},
                {"title", Title},
                {"body", Body},
                {"pushtime", PushTime},
                {"expiretime", ExpireTime},
                {"storeoffline", StoreOffline},
                {"batchnumber", BatchNumber},
                {"androidnotifytype", AndroidNotifyType},
                {"androidopentype", AndroidOpenType},
                {"androidactivity", AndroidActivity},
                {"androidopenurl", AndroidOpenUrl},
                {"androidxiaomiactivity", AndroidXiaoMiActivity},
                {"androidxiaominotifytitle", AndroidXiaoMiNotifyTitle},
                {"androidxiaominotifybody", AndroidXiaoMiNotifyBody},
                {"androidmusic", AndroidMusic},
                {"androidnotificationbartype", AndroidNotificationBarType},
                {"androidnotificationbarpriority", AndroidNotificationBarPriority},
                {"androidextparameters", AndroidExtParameters},
                {"iosapnsenv", IOSApnsEnv},
                {"iosremind", IOSRemind},
                {"iosremindbody", IOSRemindBody},
                {"iosmusic", IOSMusic},
                {"iosbadge", IOSBadge},
                {"iossilentnotification", IOSSilentNotification},
                {"iossubtitle", IOSSubtitle},
                {"iosnotificationcategory", IOSNotificationCategory},
                {"iosmutablecontent", IOSMutableContent},
                {"iosextparameters", IOSExtParameters}
            };

            return parameters;
        } 

    }
}
